#include "Account.h"

Account:: Account(){

	_data = new Data();
	_data->setMinBalance( 0 );
	_data->setOverdrawPenalty( 25 );
	_data->setMaxAttempts( 3 );
	_data->setAttempts( 0 );
	_data->setFileDrive( "C:\\" );
	_data->setFileDirectory( "Temp\\" );
	_data->setFileName( "Bank_Accounts.bin" );

	_OP = new OutputProcessor( _data );

	_M = new MDA_EFSM( _OP );

	_OA = new open_account_1();

	_LI = new login_1();

	_PI = new pin_1();

	_LO = new logout_1();

	_BA = new balance_1();

	_W = new withdraw_1();

	_D = new deposit_1();

	_A = new activate_1();

	_DA = new deactivate_1();

}

Account:: ~Account(){

	if( _data != NULL ) delete _data;

	if( _OP != NULL ) delete _OP;

	if( _M != NULL ) delete _M;

	if( _OA != NULL ) delete _OA;

	if( _LI != NULL ) delete _LI;

	if( _PI != NULL ) delete _PI;

	if( _LO != NULL ) delete _LO;

	if( _BA != NULL ) delete _BA;
	
	if( _W != NULL ) delete _W;
	
	if( _D != NULL ) delete _D;

	if( _A != NULL ) delete _A;
	
	if( _DA != NULL ) delete _DA;
	
}

void Account:: removeCurrentConfiguration(){
	
	if( _LI != NULL ) delete _LI;
	
	if( _PI != NULL ) delete _PI;
	
	if( _BA != NULL ) delete _BA;
	
	if( _W != NULL ) delete _W;
	
	if( _D != NULL ) delete _D;
	
}

bool Account:: open_account( int p_, int y_, int a_ ){
	
	if( _OA != NULL )
		return _OA->open_account( p_, y_, a_, _data, _M );
	return false;
}

bool Account:: login( int y_ ){
	
	if( _LI != NULL )
		return _LI->login( y_, _data, _M );
	return false;
	
}

bool Account:: pin( int p_ ){

	//cout << "Account:: pin() Point A .." << endl << endl;

	//cout << "Account:: pin() p_: " << p_ << endl << endl;

	//cout << "Account:: pin() ( _data != NULL ): " << ( _data != NULL ) << endl << endl;

	//cout << "Account:: pin() ( _M != NULL ): " << ( _M != NULL ) << endl << endl;

	//cout << "Account:: pin() ( _PI != NULL ): " << ( _PI != NULL ) << endl << endl;

	if( _PI != NULL )
		return _PI->pin( p_, _data, _M );
	return false;

}

bool Account:: logout(){
	
	if( _LO != NULL )
		return _LO->logout( _data, _M );
	return false;
	
}

bool Account:: balance(){

	if( _BA != NULL )
		return _BA->balance( _M );
	return false;
	
}

bool Account:: withdraw( int w_ ){
	
	if( _W != NULL ) {

		_data->setW( w_ );	// store w in data for later use in OP ..
		
		return _W->withdraw( _data, _M  );

	}

	return false;	// if W == NULL, withdraw not performed ..

}

bool Account:: deposit( int d_ ){
	
	if( _D != NULL ) {

		_data->setD( d_ );	// store d in data for later use in OP ..

		return _D->deposit( _data, _M );

	}

	return false;	// if D == NULL, deposit not performed ..

}

bool Account:: activate(){
	
	if( _A != NULL )
		return _A->activate( _data, _M );

	return false;	// if A == NULL, activate not performed ..

}

bool Account:: deactivate(){
	
	if( _DA != NULL )
		return _DA->deactivate( _data, _M );
	return false;
	
}

/*
 * SETTERS ..
 */

void Account:: setMDA_EFSM( MDA_EFSM* M_ ){
	
	_M = M_;
	
}

void Account:: setOutputProcessor( OutputProcessor* OP_ ){
	
	_OP = OP_;
	
}

void Account:: setOpenAcountA( open_account_a* OA_ ){
	
	_OA = OA_;
	
}

void Account:: setLoginA( login_a* LI_ ){
	
	_LI = LI_;
	
}

void Account:: setPinA( pin_a* PI_ ){
	
	_PI = PI_;
	
}

void Account:: setLogoutA( logout_a* LO_ ){
	
	_LO = LO_;
	
}

void Account:: setBalanceA( balance_a* BA_ ){
	
	_BA = BA_;
	
}

void Account:: setWithdrawA( withdraw_a* W_ ){
	
	_W = W_;
	
}

void Account:: setDepositA( deposit_a* D_ ){
	
	_D = D_;
	
}

void Account:: setActivateA( activate_a* A_ ){
	
	_A = A_;
	
}

void Account:: setDeactivateA( deactivate_a* DA_ ){
	
	_DA = DA_;
	
}

void Account:: setMinBalance( int minBalance_ ){
	
	_data->setMinBalance( minBalance_ );
	
}

void Account:: setOverdrawPenalty( int overdrawPenalty_ ){
	
	_data->setOverdrawPenalty( overdrawPenalty_ );
	
}

void Account:: setMaxAttempts( int maxAttempts_ ){
	
	_data->setMaxAttempts( maxAttempts_ );
	
}



/*
 * GETTERS ..
 */

MDA_EFSM* Account:: getMDA_EFSM(){
	
	return _M;
	
}

OutputProcessor* Account:: getOutputProcessor(){
	
	return _OP;
	
}

open_account_a* Account:: getOpenAcountA(){
	
	return _OA;
	
}

login_a* Account:: getLoginA(){
	
	return _LI;
	
}

pin_a* Account:: getPinA(){
	
	return _PI;
	
}

logout_a* Account:: getLogoutA(){
	
	return _LO;
	
}

balance_a* Account:: getBalanceA(){
	
	return _BA;
	
}

withdraw_a* Account:: getWithdrawA(){
	
	return _W;
	
}

deposit_a* Account:: getDepositA(){
	
	return _D;
	
}

activate_a* Account:: getActivateA(){
	
	return _A;
	
}

deactivate_a* Account:: getDeactivateA(){
	
	return _DA;
	
}

string Account:: getState(){
	
	return _M->getCurrentState()->getDescription();
	
}

int Account:: getStateID(){
	
	return _M->getCurrentState()->getID();
	
}

int Account:: getMinBalance(){
	
	return _data->getMinBalance();
	
}

int Account:: getOverdrawPenalty(){
	
	return _data->getOverdrawPenalty();
	
}

int Account:: getMaxAttempts(){
	
	return _data->getMaxAttempts();
	
}

bool Account:: getIsActive(){
	
	return _data->getCurrentAccountInfo()->getIsActive();
	
}

bool Account:: getIsOverdrawn(){
	
	return _data->getCurrentAccountInfo()->getIsOverdrawn();
	
}

int Account:: getAttempts(){
	
	return _data->getAttempts();
	
}